Bonds are derived from chem2.Bond and indicate binding interactions between sites. By default, a bond may only have two sites and a site may only have one bond.
The Bond object has a sites attribute which holds the pair of sites as a list. The following methods are available to Bond objects.
| Instance Attribute | Setter | Getter | Unsetter | 
|---|---|---|---|
id | 
set_id(id) | 
get_id() | 
|
sites | 
add_sites(*sites) | 
get_sites(**kwargs) | 
remove_sites(*sites) | 
Bonds have internal class attributes that dictate bond behavior. These include:
| Class Attribute | Default Value | Description | 
|---|---|---|
allowed_site_types | 
None | Tuple of allowed site classes | 
n_max_sites | 
2 | Maximum number of sites per bond | 
For the purpose of managing bonds, Site objects have the bond instance attribute and the allowed_to_bind class attribute.
| Instance Attribute | Setter | Getter | Unsetter | 
|---|---|---|---|
bond | 
set_bond(bond) | 
get_bond() | 
unset_bond() | 
| Class Attribute | Default Value | Description | 
|---|---|---|
allowed_to_bind | 
True | Boolean controlling whether site can have a bond | 
| Function | Site method | 
Bond method | 
|---|---|---|
| Attach sites to a bond | set_bond(bond) | 
add_sites(*sites) | 
| Detach sites from a bond | unset_bond() | 
remove_sites(*sites) | 
| Get/Filter the attached sites | get_sites(**kwargs) | 
|
| Get the attached bond | get_molecule() | 
In [1]:
    
from wc_rules.chem2 import Molecule,Site,Bond
    
In [2]:
    
# creating sites to use for bond
class LigandBinding(Site):pass
class ReceptorBinding(Site):pass
s1,s2 = LigandBinding(id='s1'), ReceptorBinding(id='s2')
    
In [3]:
    
# Attaching sites to a bond using add_sites()
bnd = Bond(id='bnd').add_sites(s1,s2)
# Getting sites attached to a bond
bnd.get_sites()
    
    Out[3]:
In [4]:
    
# Filtering attached sites by id
bnd.get_sites(id='s1')
    
    Out[4]:
In [5]:
    
# Removing attached sites using remove_sites()
bnd.remove_sites(s1,s2)
bnd.get_sites()
    
    Out[5]:
In [6]:
    
# Attaching sites to a bond using set_bond()
bnd = Bond(id='bnd')
s1.set_bond(bnd)
s2.set_bond(bnd)
bnd.get_sites()
    
    Out[6]:
In [7]:
    
# Getting bond attached to sites
[s1.get_bond().get_id(), s2.get_bond().get_id()]
    
    Out[7]:
In [8]:
    
# Removing bond from sites using remove_bond()
s1.unset_bond()
s2.unset_bond()
bnd.get_sites()
    
    Out[8]:
In [9]:
    
# Subclassing bonds to increase the number of allowed sites
class TetramerBond(Bond):
    n_max_sites = 4
    
bnd1 = TetramerBond().add_sites( Site(), Site(), Site(), Site() )
bnd2 = Bond().add_sites( Site(), Site(), Site(), Site() )
for x in [bnd1,bnd2]:
    try:
        x.verify_maximum_number_of_sites()
        print('Allowed.')
    except:
        print('Not allowed.')
    
    
Overlaps are groups of sites that can only have one bond at a time. They are used to reflect groups of sites that spatially overlap with each other.
The Overlap object has a sites attribute which holds a list of sites.
| Attribute | Setter | Getter | Unsetter | 
|---|---|---|---|
id | 
set_id(id) | 
get_id() | 
|
sites | 
add_sites(*sites) | 
get_sites(**kwargs) | 
remove_sites(*sites) | 
Site objects have the instance attribute overlaps, which holds a list of overlaps.
| Attribute | Setter | Getter | Unsetter | 
|---|---|---|---|
overlaps | 
add_overlaps(*overlaps) | 
get_overlaps(**kwargs) | 
remove_overlaps(*overlap) | 
In [10]:
    
# Creating sites to use in overlaps
s1,s2,s3 = Site(id='s1'), Site(id='s2'), Site(id='s3')
    
In [11]:
    
# Adding overlaps using add_sites()
from wc_rules.chem2 import Overlap
olp1 = Overlap(id='olp1').add_sites(s1,s2)
# Getting overlapping sites
olp1.get_sites()
    
    Out[11]:
In [12]:
    
# Filtering overlapping sites
olp1.get_sites(id='s1')
    
    Out[12]:
In [13]:
    
# Remove overlaps using remove_sites()
olp1.remove_sites(s1,s2)
olp1.get_sites()
    
    Out[13]:
In [14]:
    
# Add overlaps using add_overlaps()
s1.add_overlaps(olp1)
s2.add_overlaps(olp1)
olp1.get_sites()
    
    Out[14]:
In [15]:
    
# Get overlaps from site
s1.get_overlaps()
    
    Out[15]:
In [16]:
    
# Remove overlaps using remove_overlaps()
s1.remove_overlaps(olp1)
s2.remove_overlaps(olp1)
olp1.get_sites()
    
    Out[16]:
In [17]:
    
# An overlap may have many sites
olp1 = Overlap(id='s1').add_sites(s1,s2,s3)
olp1.get_sites()
    
    Out[17]:
In [18]:
    
# A site may have many overlaps
olp1.remove_sites(s1,s2,s3)
olp1 = Overlap(id='s1').add_sites(s1,s2)
olp2 = Overlap(id='s1').add_sites(s1,s3)
s1.get_overlaps()
    
    Out[18]: